package main.java.com.imooc.fanshe.方法的反射;

import main.java.com.imooc.fanshe.Class类的使用.ClassUtil;

import java.lang.reflect.Method;

public class MethodDemo1 {
    public static void main(String[] args) {
        // 获取print方法print(int,int)方法 1.要获取一个方法就是要获取類的信息，获取累的信息首先要获取类的类类型
        A a1 = new A();
        Class c = a1.getClass();// 獲取類的類類型
        /*
        获取方法：名称和参数列表
        getMethods获取的是public的方法
        getDeclaredMethods获取的是自己声明的方法
         */
        try {
            // 以下两种获取方法的写法都是对的
            //Method m = c.getMethod("print", new Class[]{int.class, int.class});
            Method m = c.getMethod("print", int.class, int.class);

            // 方法的反射操作
            // a1.print(10, 20);这样的活没用反射，方法的反射操作是用m对象来进行方法调用 和a1.print调用的效果完全相同
            // 方法如果没有返回值返回null，有返回值返回具体的返回值
            //Object o = m.invoke(a1, new Object[]{10, 20});
            Object o = m.invoke(a1, 10, 20);
            System.out.println(o);
            System.out.println("=============================================");

            // 獲取方法對象
            Method m1 = c.getMethod("print", String.class, String.class);
            // 用方法進行反射操作
            a1.print("大江東去", "小喬初嫁了");
            //
            Object o1 = m1.invoke(a1, "大江東去", "小喬初嫁了");
            System.out.println(o1);

            // Method m2 = c.getMethod("print",new Class[]{});
            Method m2 = c.getMethod("print");
            m2.invoke(a1);


        } catch (Exception e) {//NoSuchMethodException
            e.printStackTrace();
        }
    }
}

class A {

    public void print() {
        System.out.println("我見青山多嫵媚，料青山見我應如是");
    }

    public void print(int a, int b) {
        System.out.println(a + b);
    }

    public void print(String a, String b) {
        System.out.println(a.toUpperCase() + "，" + b.toLowerCase());
    }
}
